#define _CRT_SECURE_NO_WARNINGS 1
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        unordered_map<int, int> psCounts = { {0, 1} };    // 统计前缀和出现次数，初始ps[0] = 0出现一次
        int res = 0;                                    // 满足条件的子数组个数
        int ps = 0;                                     // 当前前缀和ps[i]
        for (auto& num : nums) {
            ps += num;                  // 更新前缀和，[0, i+1)
            res += psCounts[ps - k];    // 累加以元素nums[i]为结尾，满足子数组条件个数
            psCounts[ps] += 1;          // 将当前前缀和加入哈希表
        }
        return res;
    }
};
